Session Information

Back To Top

rr sessionInfo(package=NULL)

R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] readr_1.1.0

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.10    digest_0.6.11   rprojroot_1.2   R6_2.2.0        jsonlite_1.4    backports_1.0.5 magrittr_1.5   
 [8] evaluate_0.10   stringi_1.1.2   rmarkdown_1.3   tools_3.3.2     stringr_1.1.0   hms_0.3         yaml_2.1.14    
[15] base64enc_0.1-3 htmltools_0.3.5 knitr_1.15.1    tibble_1.3.0   

Summary of Library Data

Back To Top

This data set is from kaggle. You can find this data here. It provides detailed information about libraries in each state in the United States.

rr summary(states)

 Submission_Year    State             State_Code     Region_Code    Service_Population Service_Population_Without_Duplicates
 Min.   :2015    Length:51          Min.   : 1.00   Min.   :1.000   Min.   :  582658   Min.   :  582658                     
 1st Qu.:2015    Class :character   1st Qu.:16.50   1st Qu.:3.000   1st Qu.: 1493456   1st Qu.: 1472869                     
 Median :2015    Mode  :character   Median :29.00   Median :5.000   Median : 4395295   Median : 4395295                     
 Mean   :2015                       Mean   :28.96   Mean   :4.471   Mean   : 6181043   Mean   : 6021934                     
 3rd Qu.:2015                       3rd Qu.:41.50   3rd Qu.:6.000   3rd Qu.: 7475148   3rd Qu.: 6764752                     
 Max.   :2015                       Max.   :56.00   Max.   :8.000   Max.   :38322887   Max.   :38322887                     
 State_Population   Central_Libraries Branch_Libraries  Bookmobiles    MLS_Librarians      Librarians       Employees     
 Min.   :  582658   Min.   :  1.0     Min.   :  3.0    Min.   : 0.00   Min.   :  39.88   Min.   : 112.5   Min.   : 111.0  
 1st Qu.: 1743730   1st Qu.: 63.0     1st Qu.: 38.5    1st Qu.: 3.00   1st Qu.: 144.50   1st Qu.: 284.2   1st Qu.: 376.4  
 Median : 4395295   Median :112.0     Median : 95.0    Median : 7.00   Median : 329.58   Median : 679.9   Median :1210.1  
 Mean   : 6195242   Mean   :177.5     Mean   :150.4    Mean   :12.92   Mean   : 629.70   Mean   : 927.1   Mean   :1788.9  
 3rd Qu.: 6817706   3rd Qu.:237.5     3rd Qu.:207.0    3rd Qu.:17.50   3rd Qu.: 767.76   3rd Qu.:1171.0   3rd Qu.:2340.9  
 Max.   :38340074   Max.   :755.0     Max.   :950.0    Max.   :75.00   Max.   :3437.24   Max.   :4073.9   Max.   :8391.0  
  Total_Staff      Local_Government_Operating_Revenue State_Government_Operating_Revenue Federal_Government_Operating_Revenue
 Min.   :  245.3   Min.   :0.000e+00                  Min.   :        0                  Min.   :      0                     
 1st Qu.:  723.2   1st Qu.:4.424e+07                  1st Qu.:  1205048                  1st Qu.: 247294                     
 Median : 1817.3   Median :1.185e+08                  Median :  4033130                  Median : 497265                     
 Mean   : 2716.0   Mean   :2.016e+08                  Mean   : 16668047                  Mean   : 895589                     
 3rd Qu.: 3519.8   3rd Qu.:2.374e+08                  3rd Qu.: 12342780                  3rd Qu.:1070844                     
 Max.   :12464.9   Max.   :1.265e+09                  Max.   :345037953                  Max.   :5792339                     
 Other_Operating_Revenue Total_Operating_Revenue    Salaries            Benefits         Total_Staff_Expenditures
 Min.   :   180898       Min.   :1.830e+07       Min.   :  8517104   Min.   :   229606   Min.   : 10890655       
 1st Qu.:  4018902       1st Qu.:5.172e+07       1st Qu.: 24806427   1st Qu.:  8439042   1st Qu.: 33433702       
 Median :  9247116       Median :1.306e+08       Median : 62750473   Median : 22988790   Median : 85739263       
 Mean   : 17522202       Mean   :2.367e+08       Mean   :109245728   Mean   : 39733389   Mean   :148979117       
 3rd Qu.: 17584116       3rd Qu.:2.848e+08       3rd Qu.:139643819   3rd Qu.: 45490279   3rd Qu.:190242298       
 Max.   :191656418       Max.   :1.355e+09       Max.   :605134988   Max.   :281367947   Max.   :876111285       
 Print_Collection_Expenditures Digital_Collection_Expenditures Other_Collection_Expenditures Total_Collection_Expenditures
 Min.   : 1732866              Min.   :  158409                Min.   :   76731              Min.   :  2432733            
 1st Qu.: 3703121              1st Qu.: 1161444                1st Qu.:  756074              1st Qu.:  5457850            
 Median :10136582              Median : 2887735                Median : 3217904              Median : 15558992            
 Mean   :14738013              Mean   : 5356909                Mean   : 4911608              Mean   : 25006531            
 3rd Qu.:18743538              3rd Qu.: 6431658                3rd Qu.: 6629340              3rd Qu.: 34862064            
 Max.   :68898041              Max.   :24944727                Max.   :32163245              Max.   :112729077            
 Other_Operating_Expenditures Total_Operating_Expenditures Local_Government_Capital_Revenue State_Government_Capital_Revenue
 Min.   :  3944576            Min.   :1.731e+07            Min.   :       0                 Min.   :       0                
 1st Qu.:  9923100            1st Qu.:4.882e+07            1st Qu.: 1998838                 1st Qu.:       0                
 Median : 26913847            Median :1.260e+08            Median : 7588520                 Median :   49290                
 Mean   : 48396075            Mean   :2.224e+08            Mean   :10798721                 Mean   : 2419471                
 3rd Qu.: 56365576            3rd Qu.:2.680e+08            3rd Qu.:16868779                 3rd Qu.: 1125000                
 Max.   :326843919            Max.   :1.286e+09            Max.   :50568512                 Max.   :25243857                
 Federal_Government_Capital_Revenue Other_Capital_Revenue Total_Capital_Revenue Total_Capital_Expenditures Print_Collection  
 Min.   :       0                   Min.   :       0      Min.   :   190956     Min.   :   347748          Min.   : 1642715  
 1st Qu.:       0                   1st Qu.:  310920      1st Qu.:  4831600     1st Qu.:  5074609          1st Qu.: 4679018  
 Median :   31980                   Median : 1289455      Median :  9698454     Median : 10372327          Median : 9442086  
 Mean   :  495817                   Mean   : 4071006      Mean   : 17785016     Mean   : 22637427          Mean   :15056932  
 3rd Qu.:  211338                   3rd Qu.: 3236141      3rd Qu.: 23468550     3rd Qu.: 28077506          3rd Qu.:17167508  
 Max.   :18521642                   Max.   :87067000      Max.   :116604806     Max.   :126989107          Max.   :70815265  
 Digital_Collection Audio_Collection  Downloadable_Audio Physical_Video    Downloadable_Video Local_Cooperative_Agreements
 Min.   :   22966   Min.   :  86416   Min.   :    9338   Min.   : 119605   Min.   :     0     Min.   :    0               
 1st Qu.:  399830   1st Qu.: 230386   1st Qu.:  222568   1st Qu.: 324603   1st Qu.:  5026     1st Qu.:  395               
 Median : 1647955   Median : 593488   Median :  564568   Median : 814043   Median : 21580     Median :  888               
 Mean   : 4194353   Mean   : 893410   Mean   : 1300921   Mean   :1209907   Mean   :105070     Mean   : 1909               
 3rd Qu.: 3683356   3rd Qu.:1130140   3rd Qu.: 1358018   3rd Qu.:1437894   3rd Qu.: 71680     3rd Qu.: 1865               
 Max.   :47106859   Max.   :3530931   Max.   :11064932   Max.   :5154677   Max.   :922536     Max.   :17442               
 State_Licensed_Databases Total_Licensed_Databases Print_Subscriptions   Hours_Open      Library_Visits     
 Min.   :    0            Min.   :   74            Min.   :  2071      Min.   :  65208   Min.   :  2186038  
 1st Qu.: 1785            1st Qu.: 2810            1st Qu.:  6368      1st Qu.: 293115   1st Qu.:  7430782  
 Median : 4275            Median : 5003            Median : 14972      Median : 551274   Median : 18178677  
 Mean   : 6252            Mean   : 8161            Mean   : 26915      Mean   : 721113   Mean   : 27947560  
 3rd Qu.: 8093            3rd Qu.:11726            3rd Qu.: 36913      3rd Qu.: 922803   3rd Qu.: 35273654  
 Max.   :26371            Max.   :28951            Max.   :166683      Max.   :2392554   Max.   :164300175  
 Reference_Transactions Registered_Users   Circulation_Transactions Interlibrary_Loans_Provided Interlibrary_Loans_Received
 Min.   :  373837       Min.   :  281392   Min.   :  3938767        Min.   :       0            Min.   :      57           
 1st Qu.:  911614       1st Qu.:  924534   1st Qu.:  9299584        1st Qu.:   57346            1st Qu.:   62142           
 Median : 3483395       Median : 2476596   Median : 27866711        Median :  266163            Median :  302038           
 Mean   : 5157088       Mean   : 3372037   Mean   : 45376494        Mean   : 1385314            Mean   : 1382256           
 3rd Qu.: 6240569       3rd Qu.: 4122706   3rd Qu.: 61758828        3rd Qu.:  906895            3rd Qu.:  901136           
 Max.   :28105028       Max.   :21723648   Max.   :222788583        Max.   :11912575            Max.   :11469527           
 Library_Programs Childrens_Programs Young_Adult_Programs Library_Program_Audience Childrens_Program_Audience
 Min.   :  7940   Min.   :  5265     Min.   : 1172        Min.   : 183507          Min.   : 145049           
 1st Qu.: 25835   1st Qu.: 15432     1st Qu.: 2356        1st Qu.: 609558          1st Qu.: 388609           
 Median : 62120   Median : 37852     Median : 6168        Median :1396310          Median :1032396           
 Mean   : 87964   Mean   : 50464     Mean   : 8322        Mean   :2000421          Mean   :1376584           
 3rd Qu.:101758   3rd Qu.: 64567     3rd Qu.: 9664        3rd Qu.:2450672          3rd Qu.:1725636           
 Max.   :500005   Max.   :213468     Max.   :55526        Max.   :9491467          Max.   :6909344           
 Young_Adult_Program_Audience Public_Internet_Computers Internet_Computer_Use Wireless_Internet_Sessions  Start_Date       
 Min.   : 12589               Min.   :  524             Min.   :  577405      Min.   :      -1           Length:51         
 1st Qu.: 33708               1st Qu.: 1556             1st Qu.: 1895499      1st Qu.:  198808           Class :character  
 Median : 94146               Median : 4726             Median : 4465464      Median : 1266660           Mode  :character  
 Mean   :131304               Mean   : 5610             Mean   : 6320727      Mean   : 2926421                             
 3rd Qu.:160931               3rd Qu.: 6724             3rd Qu.: 7600968      3rd Qu.: 4223684                             
 Max.   :725295               Max.   :21735             Max.   :35000501      Max.   :15224387                             
   End_Date        
 Length:51         
 Class :character  
 Mode  :character  
                   
                   
                   

Summary of Subsets of Library Data

Back To Top

This data is a subset of the library data that was re-configured to make Digital Cost, Other Cost, Print Cost, and Total Cost to be a subset of a larger category – Collection Cost Type. This way, the data could be easily grouped on the same visualization.

rr summary(states_boxplot)

    State             Category              Cost          
 Length:204         Length:204         Min.   :    76731  
 Class :character   Class :character   1st Qu.:  2429076  
 Mode  :character   Mode  :character   Median :  5843598  
                                       Mean   : 12503265  
                                       3rd Qu.: 15685597  
                                       Max.   :112729077  

This data is a subset of the library data that was re-configured to make Children’s Programs, Young Adult Programs, and Adult Programs to be a subset of a larger category – Program Type. This way, the data could be easily grouped on the same visualization.

rr summary(Program_Category)

    State           Program_Category    Num_Programs   
 Length:153         Length:153         Min.   :  1172  
 Class :character   Class :character   1st Qu.:  7381  
 Mode  :character   Mode  :character   Median : 22070  
                                       Mean   : 48917  
                                       3rd Qu.: 62120  
                                       Max.   :500005  

Summary of Census Data

Back To Top

This data set is from the census data on data.world. You can find this data here. It provides the number of employed persons in each state.

rr summary(census_employment)

    State              Employed       
 Length:52          Min.   :  456640  
 Class :character   1st Qu.: 1398759  
 Mode  :character   Median : 3335384  
                    Mean   : 4886644  
                    3rd Qu.: 5501786  
                    Max.   :30312429  

This data set is from the census data on data.world. You can find this data here. It provides the number of people enrolled in high school in each state.

rr summary(census_enrollment)

    State           Enrollment_9to12 
 Length:52          Min.   :  24198  
 Class :character   1st Qu.:  91860  
 Mode  :character   Median : 215712  
                    Mean   : 331031  
                    3rd Qu.: 362992  
                    Max.   :2216175  

This data set is from the census data on data.world. You can find this data here. It provides the median family income in each state.

rr summary(Median_Family_Income)

    State             B19119_001   
 Length:52          Min.   :22976  
 Class :character   1st Qu.:57986  
 Mode  :character   Median :65813  
                    Mean   :66551  
                    3rd Qu.:74030  
                    Max.   :90089  

This data set is from Current Results. You can find this data here. It provides the average temperature in each state.

rr summary(State_Temp_and_Rain)

    State           Average Temperature Total Hours of Sunlight   Clear Days    
 Length:50          Min.   :26.60       Min.   :2061            Min.   : 58.00  
 Class :character   1st Qu.:45.25       1st Qu.:2514            1st Qu.: 89.25  
 Mode  :character   Median :51.20       Median :2690            Median :100.50  
                    Mean   :51.94       Mean   :2721            Mean   :103.26  
                    3rd Qu.:58.65       3rd Qu.:2924            3rd Qu.:115.00  
                    Max.   :70.70       Max.   :3806            Max.   :193.00  
                                        NA's   :3                               

This data set is from Researcher Tools. You can find this data here. It provides useful connections between state names, state codes, and regions.

rr summary(states_with_regions)

    State            State Code           Region           Sub-Region       
 Length:50          Length:50          Length:50          Length:50         
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  

The Tableau Visualizations

Back To Top

Map of the United States color-coded by region. This is an interactive map that allows you to filter what is shown on sheet Library Programs vs. Visits and Program Breakdown by Type.

Dual combination showing the number of library programs per 10,000 people and the annual visits per capita for each state. Two calculated measured were created for this visualization.

  1. Library_programs_per_10K = [Library_Programs] *10000 / [State_Population]
  2. Library_visits_per_capita = [Library_Visits] / [State_Population]

Additionally, a set was created to show High Visit States which is a grouping of states who average more than 5.5 visits per person per year.

The South region has zero states in the High Visit States set. The other three regions have either 4 or 5 states each. This implies that libraries in the south could benefit from talking to the other regions about the kinds of programs they are implementing to get people to go to the library. Additionally, the states in the southern region have noticeably fewer library programs per 10,000 residents. Looking at all of the regions, there is a general positive correlation between the number of programs per 10,000 people and the average number of visits per person. Therefore, if a state wanted to increase the number of visits to public libraries a larger budget could be allocated for library programs.

A stacked bar graph showing the percentage breakdown of total library programs into those for children, adolescents, and those for adults. To determine this, three measure calculations were used, however, these were not stored as new measures. These calculations changed the data from number of programs to a percentage of total programs for each of the three program categories.

  1. Calculation for percent children programs: [Childrens_programs] / [Library_programs]
  2. Calculation for percent adolescent programs: [Young_adult_programs] / [Library_programs]
  3. Calculation for percent adult programs: [Adult_programs] / [Library_programs]

In general, if less than 58% of states library programs are aimed at children then the annual number of visits per capita is lower. Additionally, southern states (on average) offer a lower percentage of children programs than the other three regions. This could be a contributing factor to the lower number of visits to libraries in the south.

This is a dashboard for the previous three visualizations.

Box and whisker plot showing the total digital collection cost, print collection cost, other collection cost, and total collection cost for each state. The visualization has four pages, one for each region.

All four regions spend the most on print collections with digital and other (such as audio) collection costs being roughly similar. Heavily populated states (Texas, California, New York, Ohio) fall outside the interquartile range for collection costs due to the significantly increased volume of collection material required in these larger states.

Scatterplot showing the relationship between the total collection cost and size for each state color-coded by region with a trendline for each region.

From the regional trend lines on this visualization, it can be seen that Midwest and Northeast spend less per collection item than South and West regions. The South and West regions should consult with the material procurement teams in the Midwest and Northeast regions to determine how to reduce collection costs.

This is a dashboard for the previous two visualizations.

A scatter plot showing how the average annual temperature in a state is related to the average annual visits per capita. The average annual visits per capita was found using the following formula: [Library_Visits]/[State_Population]. The points are color-coded by region and have a trend line with a 95% confidence bands.

There is a general trend that the higher the average temperature in a state the fewer number of visits per capita to the libraries. This is a logical, yet interesting result, as warmer temperatures lend themselves more towards being active and outdoors than attending the library.

A crosstab of operational revenue to cost ratio. A red-green scale was used to color the average ratio value of Profit to Expense Ratio with a ratio of 1.0 selected as the transition point between the colors. The crosstab is created with values given by state and separated by sub-region.

Profit to Expense Ratio = [Total_Operating_Revenue]/[Total_Operating_Expenditures]

New England has the lowest revenue to cost ratio. Most of the region’s libraries are profiting but no library is particularly profitable.

A filled map of the United States showing the average number of computers per library for each state. A KPI was created for this statistic and the filled color of each individual state is coordinated to whether or not the KPI is low, medium, or high and the range for each category of the KPI can be adjusted by the user. KPI Low was set to 12 and KPI Medium is set to 19.

KPI Computers per Library =

IF AVG([Public_Internet_Computers] / ([Central_Libraries] + [Branch_Libraries])) <= [KPI Low] THEN “Low” ELSEIF AVG([Public_Internet_Computers] / ([Central_Libraries] + [Branch_Libraries])) <= [KPI Medium] THEN “Medium” ELSE “High” END

KPI Low: ranges from 1 to 12 KPI Medium: ranges from 13 to 20

The midwest has the least computers per library compared to other regions. The South has the most computers per library.

A histogram of showing the annual computer usage and the states that fall into each bin with the bin size being 2.5 million. The columns are labelled with each state fall into the bin. Annual computer usage is measured in number of sessions logged.The KPI Computers per Library was used again in this case. KPI Low was set to 12 and KPI Medium is set to 19.

States that have medium to high amounts of amounts of computers per libraries (blue and red blocks) also tend to have higher amounts of computer usage. This could indicate that the extra computers available to the public allow for more computer usage.

This is a dashboard for the previous two visualizations.

The Shiny Visualizations

Back To Top

This boxplot shows the minimum, maximum, first quartile, third quartile, and median of the “Cost” values for each expenditure, including Digital Collection Expenditures, Print Collection Expenditures, Other Expenditures, and Total Expenditures. The user may select the “Cost Range” that they would like to see.

This is interesting because you can see how many states are outliers in spending on Digital and Print Expenditures.

This histogram shows the number of Librarians in each state.

This is interesting because you can see the overall trend of lot of states having relatively little Librarians (>300), while one state, New York, has almost a thousand more librarians than the second highest state, CA, created a gap in the histogram.

This graph shows how different states compare in terms of Library Visits per Median Family Income. This uses a join with the 2015 Census data.

This is interesting because it shows a trend that richer states have more library visits. We were surprised by this because libraries provide many services for free that would benefit low income families.

This graph shows the Cost per Category per State. The graph is the colored according to the table calculation: sum(Library_Visits) /sum(Service_Population_Without_Duplicates. The limits for the KPI can be selected by the user.

This is interesting because you can see that Texas has some of the highest library costs in the country, but still has a relatively low number of visitors per service population.

This graph shows the number of Librarians per State, and the fill of the graph is colored according to the table calculation of the number of citizens per Librarian.

This is interesting because you can see that GA has a relatively low number of overall librarians, but has by far the highest ratio of librarians per citizen.

This graph shows compares the total open library hours and the high school enrollment in each state.

This is interesting because, generally speaking, the states with the highest hours open have the highest high school enrollment.

LS0tDQp0aXRsZTogIlRoZSBMaWJyYXJ5IFN5c3RlbSBvZiB0aGUgVW5pdGVkIFN0YXRlcyINCnN1YnRpdGxlOiAiRGF0YSBWaXN1YWxpemF0aW9uIC0tIEZpbmFsIFByb2plY3QiDQphdXRob3I6ICJIYW5uYWggQnJpbnNrbywgSGFsZXkgRm9sa2VzLCBTYXJhaCBNb29yLCBhbmQgS2V2aW4gUGFwcGFzIg0KZGF0ZTogIldlZG5lc2RheSwgTWF5IDMsIDIwMTciDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KLS0tDQoNCiFbXG5dKGJvb2tzX2ltYWdlLnBuZykNCg0KIyMgSW1wb3J0YW50IFJlc291cmNlcyBhbmQgTGlua3MNCjxhIGhyZWY9IiN0b3AiPkJhY2sgVG8gVG9wPC9hPg0KDQpUbyBzZWUgb3VyIEdpdEh1YiByZXBvc2l0b3J5LCBjbGljayBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL0Nhbm5hdGFVVERWL3MxN2R2ZmluYWxwcm9qZWN0LWZvbGtlcy1tb29yLWJyaW5za28tcGFwcGFzKS4NCg0KVG8gc2VlIG91ciBTaGlueSBhcHBsaWNhdGlvbiwgY2xpY2sgW2hlcmVdKGh0dHBzOi8vaGJyaW5za28uc2hpbnlhcHBzLmlvL2ZpbmFscHJvamVjdCkuDQoNCiMjIFNlc3Npb24gSW5mb3JtYXRpb24NCjxhIGhyZWY9IiN0b3AiPkJhY2sgVG8gVG9wPC9hPg0KDQpgYGB7ciBzZXNzaW9uSW5mb30NCnNlc3Npb25JbmZvKHBhY2thZ2U9TlVMTCkNCmBgYA0KDQojIyBTdW1tYXJ5IG9mIExpYnJhcnkgRGF0YQ0KPGEgaHJlZj0iI3RvcCI+QmFjayBUbyBUb3A8L2E+DQoNClRoaXMgZGF0YSBzZXQgaXMgZnJvbSBrYWdnbGUuIFlvdSBjYW4gZmluZCB0aGlzIGRhdGEgW2hlcmVdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vaW1scy9wdWJsaWMtbGlicmFyaWVzKS4gSXQgcHJvdmlkZXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgbGlicmFyaWVzIGluIGVhY2ggc3RhdGUgaW4gdGhlIFVuaXRlZCBTdGF0ZXMuDQoNCmBgYHtyIHN0YXRlc30NCnN1bW1hcnkoc3RhdGVzKQ0KYGBgDQoNCiMjIFN1bW1hcnkgb2YgU3Vic2V0cyBvZiBMaWJyYXJ5IERhdGENCjxhIGhyZWY9IiN0b3AiPkJhY2sgVG8gVG9wPC9hPg0KDQpUaGlzIGRhdGEgaXMgYSBzdWJzZXQgb2YgdGhlIGxpYnJhcnkgZGF0YSB0aGF0IHdhcyByZS1jb25maWd1cmVkIHRvIG1ha2UgRGlnaXRhbCBDb3N0LCBPdGhlciBDb3N0LCBQcmludCBDb3N0LCBhbmQgVG90YWwgQ29zdCB0byBiZSBhIHN1YnNldCBvZiBhIGxhcmdlciBjYXRlZ29yeSAtLSBDb2xsZWN0aW9uIENvc3QgVHlwZS4gVGhpcyB3YXksIHRoZSBkYXRhIGNvdWxkIGJlIGVhc2lseSBncm91cGVkIG9uIHRoZSBzYW1lIHZpc3VhbGl6YXRpb24uDQoNCmBgYHtyIHN0YXRlc19ib3hwbG90fQ0Kc3VtbWFyeShzdGF0ZXNfYm94cGxvdCkNCmBgYA0KDQpUaGlzIGRhdGEgaXMgYSBzdWJzZXQgb2YgdGhlIGxpYnJhcnkgZGF0YSB0aGF0IHdhcyByZS1jb25maWd1cmVkIHRvIG1ha2UgQ2hpbGRyZW4ncyBQcm9ncmFtcywgWW91bmcgQWR1bHQgUHJvZ3JhbXMsIGFuZCBBZHVsdCBQcm9ncmFtcyB0byBiZSBhIHN1YnNldCBvZiBhIGxhcmdlciBjYXRlZ29yeSAtLSBQcm9ncmFtIFR5cGUuIFRoaXMgd2F5LCB0aGUgZGF0YSBjb3VsZCBiZSBlYXNpbHkgZ3JvdXBlZCBvbiB0aGUgc2FtZSB2aXN1YWxpemF0aW9uLg0KDQpgYGB7ciBQcm9ncmFtX0NhdGVnb3J5fQ0Kc3VtbWFyeShQcm9ncmFtX0NhdGVnb3J5KQ0KYGBgDQoNCiMjIFN1bW1hcnkgb2YgQ2Vuc3VzIERhdGENCjxhIGhyZWY9IiN0b3AiPkJhY2sgVG8gVG9wPC9hPg0KDQpUaGlzIGRhdGEgc2V0IGlzIGZyb20gdGhlIGNlbnN1cyBkYXRhIG9uIGRhdGEud29ybGQuIFlvdSBjYW4gZmluZCB0aGlzIGRhdGEgW2hlcmVdKGh0dHBzOi8vZGF0YS53b3JsZC91c2NlbnN1c2J1cmVhdS9hY3MtMjAxNS01LWUtZW1wbG95bWVudHN0YXR1cy9maWxlL1VTQV9BbGxfU3RhdGVzLmNzdikuIEl0IHByb3ZpZGVzIHRoZSBudW1iZXIgb2YgZW1wbG95ZWQgcGVyc29ucyBpbiBlYWNoIHN0YXRlLg0KDQpgYGB7ciBjZW5zdXNfZW1wbG95bWVudH0NCnN1bW1hcnkoY2Vuc3VzX2VtcGxveW1lbnQpDQpgYGANCg0KVGhpcyBkYXRhIHNldCBpcyBmcm9tIHRoZSBjZW5zdXMgZGF0YSBvbiBkYXRhLndvcmxkLiBZb3UgY2FuIGZpbmQgdGhpcyBkYXRhIFtoZXJlXShodHRwczovL2RhdGEud29ybGQvdXNjZW5zdXNidXJlYXUvYWNzLTIwMTUtNS1lLXNjaG9vbGVucm9sbG1lbnQvZmlsZS9VU0FfQWxsX1N0YXRlcy5jc3YpLiBJdCBwcm92aWRlcyB0aGUgbnVtYmVyIG9mIHBlb3BsZSBlbnJvbGxlZCBpbiBoaWdoIHNjaG9vbCBpbiBlYWNoIHN0YXRlLg0KDQpgYGB7ciBjZW5zdXNfZW5yb2xsbWVudH0NCnN1bW1hcnkoY2Vuc3VzX2Vucm9sbG1lbnQpDQpgYGANCg0KVGhpcyBkYXRhIHNldCBpcyBmcm9tIHRoZSBjZW5zdXMgZGF0YSBvbiBkYXRhLndvcmxkLiBZb3UgY2FuIGZpbmQgdGhpcyBkYXRhIFtoZXJlXShodHRwczovL2RhdGEud29ybGQvdXNjZW5zdXNidXJlYXUvYWNzLTIwMTUtNS1lLWluY29tZS9VU0FfQWxsX1N0YXRlcy5jc3YpLiBJdCBwcm92aWRlcyB0aGUgbWVkaWFuIGZhbWlseSBpbmNvbWUgaW4gZWFjaCBzdGF0ZS4NCg0KYGBge3IgTWVkaWFuX0ZhbWlseV9JbmNvbWV9DQpzdW1tYXJ5KE1lZGlhbl9GYW1pbHlfSW5jb21lKQ0KYGBgDQoNClRoaXMgZGF0YSBzZXQgaXMgZnJvbSBDdXJyZW50IFJlc3VsdHMuIFlvdSBjYW4gZmluZCB0aGlzIGRhdGEgW2hlcmVdKGh0dHBzOi8vd3d3LmN1cnJlbnRyZXN1bHRzLmNvbS9XZWF0aGVyL1VTL2F2ZXJhZ2UtYW5udWFsLXN0YXRlLXRlbXBlcmF0dXJlcy5waHApLiBJdCBwcm92aWRlcyB0aGUgYXZlcmFnZSB0ZW1wZXJhdHVyZSBpbiBlYWNoIHN0YXRlLg0KDQpgYGB7ciBTdGF0ZV9UZW1wX2FuZF9SYWlufQ0Kc3VtbWFyeShTdGF0ZV9UZW1wX2FuZF9SYWluKQ0KYGBgDQoNClRoaXMgZGF0YSBzZXQgaXMgZnJvbSBSZXNlYXJjaGVyIFRvb2xzLiBZb3UgY2FuIGZpbmQgdGhpcyBkYXRhIFtoZXJlXShodHRwOi8vcmVzZWFyY2hlcnRvb2xzLmJsb2dzcG90LmNvbS8yMDEyLzA5L2V4Y2VsLWZpbGUtd2l0aC11cy1zdGF0ZXMtYWJicmV2aWF0aW9ucy5odG1sKS4gSXQgcHJvdmlkZXMgdXNlZnVsIGNvbm5lY3Rpb25zIGJldHdlZW4gc3RhdGUgbmFtZXMsIHN0YXRlIGNvZGVzLCBhbmQgcmVnaW9ucy4gDQoNCmBgYHtyIHN0YXRlc193aXRoX3JlZ2lvbnN9DQpzdW1tYXJ5KHN0YXRlc193aXRoX3JlZ2lvbnMpDQpgYGANCg0KIyMgVGhlIFRhYmxlYXUgVmlzdWFsaXphdGlvbnMNCjxhIGhyZWY9IiN0b3AiPkJhY2sgVG8gVG9wPC9hPg0KDQpNYXAgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgY29sb3ItY29kZWQgYnkgcmVnaW9uLiBUaGlzIGlzIGFuIGludGVyYWN0aXZlIG1hcCB0aGF0IGFsbG93cyB5b3UgdG8gZmlsdGVyIHdoYXQgaXMgc2hvd24gb24gc2hlZXQgTGlicmFyeSBQcm9ncmFtcyB2cy4gVmlzaXRzIGFuZCBQcm9ncmFtIEJyZWFrZG93biBieSBUeXBlLiAgIA0KIVtcbl0oRmlsbGVkX1VTX1N0YXRlX01hcC5wbmcpDQoNCkR1YWwgY29tYmluYXRpb24gc2hvd2luZyB0aGUgbnVtYmVyIG9mIGxpYnJhcnkgcHJvZ3JhbXMgcGVyIDEwLDAwMCBwZW9wbGUgYW5kIHRoZSBhbm51YWwgdmlzaXRzIHBlciBjYXBpdGEgZm9yIGVhY2ggc3RhdGUuIFR3byBjYWxjdWxhdGVkIG1lYXN1cmVkIHdlcmUgY3JlYXRlZCBmb3IgdGhpcyB2aXN1YWxpemF0aW9uLiANCg0KMSkgTGlicmFyeV9wcm9ncmFtc19wZXJfMTBLID0gW0xpYnJhcnlfUHJvZ3JhbXNdICoxMDAwMCAvIFtTdGF0ZV9Qb3B1bGF0aW9uXQ0KMikgTGlicmFyeV92aXNpdHNfcGVyX2NhcGl0YSA9IFtMaWJyYXJ5X1Zpc2l0c10gLyBbU3RhdGVfUG9wdWxhdGlvbl0NCg0KQWRkaXRpb25hbGx5LCBhIHNldCB3YXMgY3JlYXRlZCB0byBzaG93IEhpZ2ggVmlzaXQgU3RhdGVzIHdoaWNoIGlzIGEgZ3JvdXBpbmcgb2Ygc3RhdGVzIHdobyBhdmVyYWdlIG1vcmUgdGhhbiA1LjUgdmlzaXRzIHBlciBwZXJzb24gcGVyIHllYXIuDQoNClRoZSBTb3V0aCByZWdpb24gaGFzIHplcm8gc3RhdGVzIGluIHRoZSBIaWdoIFZpc2l0IFN0YXRlcyBzZXQuIFRoZSBvdGhlciB0aHJlZSByZWdpb25zIGhhdmUgZWl0aGVyIDQgb3IgNSBzdGF0ZXMgZWFjaC4gVGhpcyBpbXBsaWVzIHRoYXQgbGlicmFyaWVzIGluIHRoZSBzb3V0aCBjb3VsZCBiZW5lZml0IGZyb20gdGFsa2luZyB0byB0aGUgb3RoZXIgcmVnaW9ucyBhYm91dCB0aGUga2luZHMgb2YgcHJvZ3JhbXMgdGhleSBhcmUgaW1wbGVtZW50aW5nIHRvIGdldCBwZW9wbGUgdG8gZ28gdG8gdGhlIGxpYnJhcnkuIEFkZGl0aW9uYWxseSwgdGhlIHN0YXRlcyBpbiB0aGUgc291dGhlcm4gcmVnaW9uIGhhdmUgbm90aWNlYWJseSBmZXdlciBsaWJyYXJ5IHByb2dyYW1zIHBlciAxMCwwMDAgcmVzaWRlbnRzLiBMb29raW5nIGF0IGFsbCBvZiB0aGUgcmVnaW9ucywgdGhlcmUgaXMgYSBnZW5lcmFsIHBvc2l0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIG51bWJlciBvZiBwcm9ncmFtcyBwZXIgMTAsMDAwIHBlb3BsZSBhbmQgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHZpc2l0cyBwZXIgcGVyc29uLiBUaGVyZWZvcmUsIGlmIGEgc3RhdGUgd2FudGVkIHRvIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgdmlzaXRzIHRvIHB1YmxpYyBsaWJyYXJpZXMgYSBsYXJnZXIgYnVkZ2V0IGNvdWxkIGJlIGFsbG9jYXRlZCBmb3IgbGlicmFyeSBwcm9ncmFtcy4NCiFbXG5dKER1YWxfQ29tYmluYXRpb25fUHJvZ3JhbXNfVmlzaXRzLnBuZykNCg0KQSBzdGFja2VkIGJhciBncmFwaCBzaG93aW5nIHRoZSBwZXJjZW50YWdlIGJyZWFrZG93biBvZiB0b3RhbCBsaWJyYXJ5IHByb2dyYW1zIGludG8gdGhvc2UgZm9yIGNoaWxkcmVuLCBhZG9sZXNjZW50cywgYW5kIHRob3NlIGZvciBhZHVsdHMuIFRvIGRldGVybWluZSB0aGlzLCB0aHJlZSBtZWFzdXJlIGNhbGN1bGF0aW9ucyB3ZXJlIHVzZWQsIGhvd2V2ZXIsIHRoZXNlIHdlcmUgbm90IHN0b3JlZCBhcyBuZXcgbWVhc3VyZXMuIFRoZXNlIGNhbGN1bGF0aW9ucyBjaGFuZ2VkIHRoZSBkYXRhIGZyb20gbnVtYmVyIG9mIHByb2dyYW1zIHRvIGEgcGVyY2VudGFnZSBvZiB0b3RhbCBwcm9ncmFtcyBmb3IgZWFjaCBvZiB0aGUgdGhyZWUgcHJvZ3JhbSBjYXRlZ29yaWVzLiANCg0KMSkgQ2FsY3VsYXRpb24gZm9yIHBlcmNlbnQgY2hpbGRyZW4gcHJvZ3JhbXM6IFtDaGlsZHJlbnNfcHJvZ3JhbXNdIC8gW0xpYnJhcnlfcHJvZ3JhbXNdDQoyKSBDYWxjdWxhdGlvbiBmb3IgcGVyY2VudCBhZG9sZXNjZW50IHByb2dyYW1zOiBbWW91bmdfYWR1bHRfcHJvZ3JhbXNdIC8gW0xpYnJhcnlfcHJvZ3JhbXNdDQozKSBDYWxjdWxhdGlvbiBmb3IgcGVyY2VudCBhZHVsdCBwcm9ncmFtczogW0FkdWx0X3Byb2dyYW1zXSAvIFtMaWJyYXJ5X3Byb2dyYW1zXQ0KDQpJbiBnZW5lcmFsLCBpZiBsZXNzIHRoYW4gNTglIG9mIHN0YXRlcyBsaWJyYXJ5IHByb2dyYW1zIGFyZSBhaW1lZCBhdCBjaGlsZHJlbiB0aGVuIHRoZSBhbm51YWwgbnVtYmVyIG9mIHZpc2l0cyBwZXIgY2FwaXRhIGlzIGxvd2VyLiBBZGRpdGlvbmFsbHksIHNvdXRoZXJuIHN0YXRlcyAob24gYXZlcmFnZSkgb2ZmZXIgYSBsb3dlciBwZXJjZW50YWdlIG9mIGNoaWxkcmVuIHByb2dyYW1zIHRoYW4gdGhlIG90aGVyIHRocmVlIHJlZ2lvbnMuIFRoaXMgY291bGQgYmUgYSBjb250cmlidXRpbmcgZmFjdG9yIHRvIHRoZSBsb3dlciBudW1iZXIgb2YgdmlzaXRzIHRvIGxpYnJhcmllcyBpbiB0aGUgc291dGguIA0KIVtcbl0oU3RhY2tlZF9iYXJfcHJvZ3JhbV9icmVha2Rvd24ucG5nKQ0KDQpUaGlzIGlzIGEgZGFzaGJvYXJkIGZvciB0aGUgcHJldmlvdXMgdGhyZWUgdmlzdWFsaXphdGlvbnMuDQohW1xuXShEYXNoYm9hcmRfTGlicmFyeV9wcm9ncmFtc192c19WaXNpdHMucG5nKQ0KDQpCb3ggYW5kIHdoaXNrZXIgcGxvdCBzaG93aW5nIHRoZSB0b3RhbCBkaWdpdGFsIGNvbGxlY3Rpb24gY29zdCwgcHJpbnQgY29sbGVjdGlvbiBjb3N0LCBvdGhlciBjb2xsZWN0aW9uIGNvc3QsIGFuZCB0b3RhbCBjb2xsZWN0aW9uIGNvc3QgZm9yIGVhY2ggc3RhdGUuIFRoZSB2aXN1YWxpemF0aW9uIGhhcyBmb3VyIHBhZ2VzLCBvbmUgZm9yIGVhY2ggcmVnaW9uLg0KDQpBbGwgZm91ciByZWdpb25zIHNwZW5kIHRoZSBtb3N0IG9uIHByaW50IGNvbGxlY3Rpb25zIHdpdGggZGlnaXRhbCBhbmQgb3RoZXIgKHN1Y2ggYXMgYXVkaW8pIGNvbGxlY3Rpb24gY29zdHMgYmVpbmcgcm91Z2hseSBzaW1pbGFyLiBIZWF2aWx5IHBvcHVsYXRlZCBzdGF0ZXMgKFRleGFzLCBDYWxpZm9ybmlhLCBOZXcgWW9yaywgT2hpbykgZmFsbCBvdXRzaWRlIHRoZSBpbnRlcnF1YXJ0aWxlIHJhbmdlIGZvciBjb2xsZWN0aW9uIGNvc3RzIGR1ZSB0byB0aGUgc2lnbmlmaWNhbnRseSBpbmNyZWFzZWQgdm9sdW1lIG9mIGNvbGxlY3Rpb24gbWF0ZXJpYWwgcmVxdWlyZWQgaW4gdGhlc2UgbGFyZ2VyIHN0YXRlcy4NCiFbXG5dKGJveF9hbmRfd2hpc2tlcl9jb2xsZWN0aW9uX2Nvc3RzLnBuZykNCg0KU2NhdHRlcnBsb3Qgc2hvd2luZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHRvdGFsIGNvbGxlY3Rpb24gY29zdCBhbmQgc2l6ZSBmb3IgZWFjaCBzdGF0ZSBjb2xvci1jb2RlZCBieSByZWdpb24gd2l0aCBhIHRyZW5kbGluZSBmb3IgZWFjaCByZWdpb24uDQoNCkZyb20gdGhlIHJlZ2lvbmFsIHRyZW5kIGxpbmVzIG9uIHRoaXMgdmlzdWFsaXphdGlvbiwgaXQgY2FuIGJlIHNlZW4gdGhhdCBNaWR3ZXN0IGFuZCBOb3J0aGVhc3Qgc3BlbmQgbGVzcyBwZXIgY29sbGVjdGlvbiBpdGVtIHRoYW4gU291dGggYW5kIFdlc3QgcmVnaW9ucy4gVGhlIFNvdXRoIGFuZCBXZXN0IHJlZ2lvbnMgc2hvdWxkIGNvbnN1bHQgd2l0aCB0aGUgbWF0ZXJpYWwgcHJvY3VyZW1lbnQgdGVhbXMgaW4gdGhlIE1pZHdlc3QgYW5kIE5vcnRoZWFzdCByZWdpb25zIHRvIGRldGVybWluZSBob3cgdG8gcmVkdWNlIGNvbGxlY3Rpb24gY29zdHMuDQohW1xuXShTY2F0dGVycGxvdF9jb2xsZWN0aW9uX2Nvc3RfYW5kX3NpemUucG5nKQ0KDQpUaGlzIGlzIGEgZGFzaGJvYXJkIGZvciB0aGUgcHJldmlvdXMgdHdvIHZpc3VhbGl6YXRpb25zLg0KIVtcbl0oRGFzaGJvYXJkX0NvbGxlY3Rpb25fQ29zdF92c19TaXplLnBuZykNCg0KQSBzY2F0dGVyIHBsb3Qgc2hvd2luZyBob3cgdGhlIGF2ZXJhZ2UgYW5udWFsIHRlbXBlcmF0dXJlIGluIGEgc3RhdGUgaXMgcmVsYXRlZCB0byB0aGUgYXZlcmFnZSBhbm51YWwgdmlzaXRzIHBlciBjYXBpdGEuIFRoZSBhdmVyYWdlIGFubnVhbCB2aXNpdHMgcGVyIGNhcGl0YSB3YXMgZm91bmQgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtdWxhOiBbTGlicmFyeV9WaXNpdHNdL1tTdGF0ZV9Qb3B1bGF0aW9uXS4gVGhlIHBvaW50cyBhcmUgY29sb3ItY29kZWQgYnkgcmVnaW9uIGFuZCBoYXZlIGEgdHJlbmQgbGluZSB3aXRoIGEgOTUlIGNvbmZpZGVuY2UgYmFuZHMuDQoNClRoZXJlIGlzIGEgZ2VuZXJhbCB0cmVuZCB0aGF0IHRoZSBoaWdoZXIgdGhlIGF2ZXJhZ2UgdGVtcGVyYXR1cmUgaW4gYSBzdGF0ZSB0aGUgZmV3ZXIgbnVtYmVyIG9mIHZpc2l0cyBwZXIgY2FwaXRhIHRvIHRoZSBsaWJyYXJpZXMuIFRoaXMgaXMgYSBsb2dpY2FsLCB5ZXQgaW50ZXJlc3RpbmcgcmVzdWx0LCBhcyB3YXJtZXIgdGVtcGVyYXR1cmVzIGxlbmQgdGhlbXNlbHZlcyBtb3JlIHRvd2FyZHMgYmVpbmcgYWN0aXZlIGFuZCBvdXRkb29ycyB0aGFuIGF0dGVuZGluZyB0aGUgbGlicmFyeS4gDQohW1xuXShTY2F0dGVycGxvdF9Bbm51YWxfVGVtcF92c19WaXNpdHMucG5nKQ0KDQpBIGNyb3NzdGFiIG9mIG9wZXJhdGlvbmFsIHJldmVudWUgdG8gY29zdCByYXRpby4gQSByZWQtZ3JlZW4gc2NhbGUgd2FzIHVzZWQgdG8gY29sb3IgdGhlIGF2ZXJhZ2UgcmF0aW8gdmFsdWUgb2YgUHJvZml0IHRvIEV4cGVuc2UgUmF0aW8gd2l0aCBhIHJhdGlvIG9mIDEuMCBzZWxlY3RlZCBhcyB0aGUgdHJhbnNpdGlvbiBwb2ludCBiZXR3ZWVuIHRoZSBjb2xvcnMuIFRoZSBjcm9zc3RhYiBpcyBjcmVhdGVkIHdpdGggdmFsdWVzIGdpdmVuIGJ5IHN0YXRlIGFuZCBzZXBhcmF0ZWQgYnkgc3ViLXJlZ2lvbi4NCg0KUHJvZml0IHRvIEV4cGVuc2UgUmF0aW8gPSBbVG90YWxfT3BlcmF0aW5nX1JldmVudWVdL1tUb3RhbF9PcGVyYXRpbmdfRXhwZW5kaXR1cmVzXQ0KCQ0KTmV3IEVuZ2xhbmQgaGFzIHRoZSBsb3dlc3QgcmV2ZW51ZSB0byBjb3N0IHJhdGlvLiBNb3N0IG9mIHRoZSByZWdpb24ncyBsaWJyYXJpZXMgYXJlIHByb2ZpdGluZyBidXQgbm8gbGlicmFyeSBpcyBwYXJ0aWN1bGFybHkgcHJvZml0YWJsZS4NCiFbXG5dKENyb3NzdGFiX3JldmVudWVfY29zdF9yYXRpby5wbmcpDQoNCkEgZmlsbGVkIG1hcCBvZiB0aGUgVW5pdGVkIFN0YXRlcyBzaG93aW5nIHRoZSBhdmVyYWdlIG51bWJlciBvZiBjb21wdXRlcnMgcGVyIGxpYnJhcnkgZm9yIGVhY2ggc3RhdGUuIEEgS1BJIHdhcyBjcmVhdGVkIGZvciB0aGlzIHN0YXRpc3RpYyBhbmQgdGhlIGZpbGxlZCBjb2xvciBvZiBlYWNoIGluZGl2aWR1YWwgc3RhdGUgaXMgY29vcmRpbmF0ZWQgdG8gd2hldGhlciBvciBub3QgdGhlIEtQSSBpcyBsb3csIG1lZGl1bSwgb3IgaGlnaCBhbmQgdGhlIHJhbmdlIGZvciBlYWNoIGNhdGVnb3J5IG9mIHRoZSBLUEkgY2FuIGJlIGFkanVzdGVkIGJ5IHRoZSB1c2VyLiBLUEkgTG93IHdhcyBzZXQgdG8gMTIgYW5kIEtQSSBNZWRpdW0gaXMgc2V0IHRvIDE5Lg0KDQpLUEkgQ29tcHV0ZXJzIHBlciBMaWJyYXJ5ID0NCg0KSUYgQVZHKFtQdWJsaWNfSW50ZXJuZXRfQ29tcHV0ZXJzXSAvIChbQ2VudHJhbF9MaWJyYXJpZXNdICsgW0JyYW5jaF9MaWJyYXJpZXNdKSkgPD0gW0tQSSBMb3ddIFRIRU4gIkxvdyINCkVMU0VJRiBBVkcoW1B1YmxpY19JbnRlcm5ldF9Db21wdXRlcnNdIC8gKFtDZW50cmFsX0xpYnJhcmllc10gKyBbQnJhbmNoX0xpYnJhcmllc10pKSA8PSBbS1BJIE1lZGl1bV0gVEhFTiAiTWVkaXVtIg0KRUxTRSAiSGlnaCINCkVORA0KDQpLUEkgTG93OiByYW5nZXMgZnJvbSAxIHRvIDEyDQpLUEkgTWVkaXVtOiByYW5nZXMgZnJvbSAxMyB0byAyMA0KDQpUaGUgbWlkd2VzdCBoYXMgdGhlIGxlYXN0IGNvbXB1dGVycyBwZXIgbGlicmFyeSBjb21wYXJlZCB0byBvdGhlciByZWdpb25zLiBUaGUgU291dGggaGFzIHRoZSBtb3N0IGNvbXB1dGVycyBwZXIgbGlicmFyeS4gDQohW1xuXShGaWxsZWRfbWFwX2NvbXB1dGVyc19rcGkucG5nKQ0KDQpBIGhpc3RvZ3JhbSBvZiBzaG93aW5nIHRoZSBhbm51YWwgY29tcHV0ZXIgdXNhZ2UgYW5kIHRoZSBzdGF0ZXMgdGhhdCBmYWxsIGludG8gZWFjaCBiaW4gd2l0aCB0aGUgYmluIHNpemUgYmVpbmcgMi41IG1pbGxpb24uIFRoZSBjb2x1bW5zIGFyZSBsYWJlbGxlZCB3aXRoIGVhY2ggc3RhdGUgZmFsbCBpbnRvIHRoZSBiaW4uIEFubnVhbCBjb21wdXRlciB1c2FnZSBpcyBtZWFzdXJlZCBpbiBudW1iZXIgb2Ygc2Vzc2lvbnMgbG9nZ2VkLlRoZSBLUEkgQ29tcHV0ZXJzIHBlciBMaWJyYXJ5IHdhcyB1c2VkIGFnYWluIGluIHRoaXMgY2FzZS4gS1BJIExvdyB3YXMgc2V0IHRvIDEyIGFuZCBLUEkgTWVkaXVtIGlzIHNldCB0byAxOS4NCg0KU3RhdGVzIHRoYXQgaGF2ZSBtZWRpdW0gdG8gaGlnaCBhbW91bnRzIG9mIGFtb3VudHMgb2YgY29tcHV0ZXJzIHBlciBsaWJyYXJpZXMgKGJsdWUgYW5kIHJlZCBibG9ja3MpIGFsc28gdGVuZCB0byBoYXZlIGhpZ2hlciBhbW91bnRzIG9mIGNvbXB1dGVyIHVzYWdlLiBUaGlzIGNvdWxkIGluZGljYXRlIHRoYXQgdGhlIGV4dHJhIGNvbXB1dGVycyBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYyBhbGxvdyBmb3IgbW9yZSBjb21wdXRlciB1c2FnZS4NCg0KIVtcbl0oSGlzdG9ncmFtX2NvbXB1dGVyX3VzZS5wbmcpDQoNClRoaXMgaXMgYSBkYXNoYm9hcmQgZm9yIHRoZSBwcmV2aW91cyB0d28gdmlzdWFsaXphdGlvbnMuDQohW1xuXShEYXNoYm9hcmRfQ29tcHV0ZXJfQ291bnRfYW5kX1VzYWdlLnBuZykNCg0KIyMgVGhlIFNoaW55IFZpc3VhbGl6YXRpb25zDQo8YSBocmVmPSIjdG9wIj5CYWNrIFRvIFRvcDwvYT4NCg0KVGhpcyBib3hwbG90IHNob3dzIHRoZSBtaW5pbXVtLCBtYXhpbXVtLCBmaXJzdCBxdWFydGlsZSwgdGhpcmQgcXVhcnRpbGUsIGFuZCBtZWRpYW4gb2YgdGhlICJDb3N0IiB2YWx1ZXMgZm9yIGVhY2ggZXhwZW5kaXR1cmUsIGluY2x1ZGluZyBEaWdpdGFsIENvbGxlY3Rpb24gRXhwZW5kaXR1cmVzLCBQcmludCBDb2xsZWN0aW9uIEV4cGVuZGl0dXJlcywgT3RoZXIgRXhwZW5kaXR1cmVzLCBhbmQgVG90YWwgRXhwZW5kaXR1cmVzLiBUaGUgdXNlciBtYXkgc2VsZWN0IHRoZSAiQ29zdCBSYW5nZSIgdGhhdCB0aGV5IHdvdWxkIGxpa2UgdG8gc2VlLiANCg0KVGhpcyBpcyBpbnRlcmVzdGluZyBiZWNhdXNlIHlvdSBjYW4gc2VlIGhvdyBtYW55IHN0YXRlcyBhcmUgb3V0bGllcnMgaW4gc3BlbmRpbmcgb24gRGlnaXRhbCBhbmQgUHJpbnQgRXhwZW5kaXR1cmVzLg0KDQohW1xuXShCb3hwbG90LnBuZykNCg0KVGhpcyBoaXN0b2dyYW0gc2hvd3MgdGhlIG51bWJlciBvZiBMaWJyYXJpYW5zIGluIGVhY2ggc3RhdGUuDQoNClRoaXMgaXMgaW50ZXJlc3RpbmcgYmVjYXVzZSB5b3UgY2FuIHNlZSB0aGUgb3ZlcmFsbCB0cmVuZCBvZiBsb3Qgb2Ygc3RhdGVzIGhhdmluZyByZWxhdGl2ZWx5IGxpdHRsZSBMaWJyYXJpYW5zICg+MzAwKSwgd2hpbGUgb25lIHN0YXRlLCBOZXcgWW9yaywgaGFzIGFsbW9zdCBhIHRob3VzYW5kIG1vcmUgbGlicmFyaWFucyB0aGFuIHRoZSBzZWNvbmQgaGlnaGVzdCBzdGF0ZSwgQ0EsIGNyZWF0ZWQgYSBnYXAgaW4gdGhlIGhpc3RvZ3JhbS4NCg0KIVtcbl0oSGlzdG9ncmFtLnBuZykNCg0KVGhpcyBncmFwaCBzaG93cyBob3cgZGlmZmVyZW50IHN0YXRlcyBjb21wYXJlIGluIHRlcm1zIG9mIExpYnJhcnkgVmlzaXRzIHBlciBNZWRpYW4gRmFtaWx5IEluY29tZS4gVGhpcyB1c2VzIGEgam9pbiB3aXRoIHRoZSAyMDE1IENlbnN1cyBkYXRhLiANCg0KVGhpcyBpcyBpbnRlcmVzdGluZyBiZWNhdXNlIGl0IHNob3dzIGEgdHJlbmQgdGhhdCByaWNoZXIgc3RhdGVzIGhhdmUgbW9yZSBsaWJyYXJ5IHZpc2l0cy4gV2Ugd2VyZSBzdXJwcmlzZWQgYnkgdGhpcyBiZWNhdXNlIGxpYnJhcmllcyBwcm92aWRlIG1hbnkgc2VydmljZXMgZm9yIGZyZWUgdGhhdCB3b3VsZCBiZW5lZml0IGxvdyBpbmNvbWUgZmFtaWxpZXMuDQoNCiFbXG5dKFNjYXR0ZXJwbG90LnBuZykNCg0KVGhpcyBncmFwaCBzaG93cyB0aGUgQ29zdCBwZXIgQ2F0ZWdvcnkgcGVyIFN0YXRlLiBUaGUgZ3JhcGggaXMgdGhlIGNvbG9yZWQgYWNjb3JkaW5nIHRvIHRoZSB0YWJsZSBjYWxjdWxhdGlvbjogc3VtKExpYnJhcnlfVmlzaXRzKSAvc3VtKFNlcnZpY2VfUG9wdWxhdGlvbl9XaXRob3V0X0R1cGxpY2F0ZXMuIFRoZSBsaW1pdHMgZm9yIHRoZSBLUEkgY2FuIGJlIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLg0KDQpUaGlzIGlzIGludGVyZXN0aW5nIGJlY2F1c2UgeW91IGNhbiBzZWUgdGhhdCBUZXhhcyBoYXMgc29tZSBvZiB0aGUgaGlnaGVzdCBsaWJyYXJ5IGNvc3RzIGluIHRoZSBjb3VudHJ5LCBidXQgc3RpbGwgaGFzIGEgcmVsYXRpdmVseSBsb3cgbnVtYmVyIG9mIHZpc2l0b3JzIHBlciBzZXJ2aWNlIHBvcHVsYXRpb24uDQoNCiFbXG5dKENyb3NzdGFiLnBuZykNCg0KVGhpcyBncmFwaCBzaG93cyB0aGUgbnVtYmVyIG9mIExpYnJhcmlhbnMgcGVyIFN0YXRlLCBhbmQgdGhlIGZpbGwgb2YgdGhlIGdyYXBoIGlzIGNvbG9yZWQgYWNjb3JkaW5nIHRvIHRoZSB0YWJsZSBjYWxjdWxhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIGNpdGl6ZW5zIHBlciBMaWJyYXJpYW4uIA0KDQoNClRoaXMgaXMgaW50ZXJlc3RpbmcgYmVjYXVzZSB5b3UgY2FuIHNlZSB0aGF0IEdBIGhhcyBhIHJlbGF0aXZlbHkgbG93IG51bWJlciBvZiBvdmVyYWxsIGxpYnJhcmlhbnMsIGJ1dCBoYXMgYnkgZmFyIHRoZSBoaWdoZXN0IHJhdGlvIG9mIGxpYnJhcmlhbnMgcGVyIGNpdGl6ZW4uIA0KDQohW1xuXShCYXJjaGFydC5wbmcpDQoNClRoaXMgZ3JhcGggc2hvd3MgY29tcGFyZXMgdGhlIHRvdGFsIG9wZW4gbGlicmFyeSBob3VycyBhbmQgdGhlIGhpZ2ggc2Nob29sIGVucm9sbG1lbnQgaW4gZWFjaCBzdGF0ZS4NCg0KVGhpcyBpcyBpbnRlcmVzdGluZyBiZWNhdXNlLCBnZW5lcmFsbHkgc3BlYWtpbmcsIHRoZSBzdGF0ZXMgd2l0aCB0aGUgaGlnaGVzdCBob3VycyBvcGVuIGhhdmUgdGhlIGhpZ2hlc3QgaGlnaCBzY2hvb2wgZW5yb2xsbWVudC4gDQoNCiFbXG5dKEJhcmNoYXJ0Mi5wbmcpDQoNCg0K